﻿// THIS FILE IS PART OF WinFormium PROJECT
// THE WinFormium PROJECT IS AN OPENSOURCE LIBRARY LICENSED UNDER THE MIT License.
// COPYRIGHTS (C) Xuanchen Lin. ALL RIGHTS RESERVED.
// GITHUB: https://github.com/XuanchenLin/NanUI


using WinFormium.CefGlue.Interop;

namespace WinFormium.CefGlue;
/// <summary>
/// Class used to represent a single element in the request post data. The
/// methods of this class may be called on any thread.
/// </summary>
public sealed unsafe partial class CefPostDataElement
{
    /// <summary>
    /// Create a new CefPostDataElement object.
    /// </summary>
    public static CefPostDataElement Create()
    {
        return CefPostDataElement.FromNative(
            cef_post_data_element_t.create()
            );
    }

    /// <summary>
    /// Returns true if this object is read-only.
    /// </summary>
    public bool IsReadOnly
    {
        get { return cef_post_data_element_t.is_read_only(_self) != 0; }
    }

    /// <summary>
    /// Remove all contents from the post data element.
    /// </summary>
    public void SetToEmpty()
    {
        cef_post_data_element_t.set_to_empty(_self);
    }

    /// <summary>
    /// The post data element will represent a file.
    /// </summary>
    public void SetToFile(string fileName)
    {
        if (string.IsNullOrEmpty(fileName)) throw new ArgumentException("Argument can't be null or empty.", "fileName");

        fixed (char* fileName_str = fileName)
        {
            var n_fileName = new cef_string_t(fileName_str, fileName.Length);
            cef_post_data_element_t.set_to_file(_self, &n_fileName);
        }
    }

    /// <summary>
    /// The post data element will represent bytes.  The bytes passed
    /// in will be copied.
    /// </summary>
    public void SetToBytes(byte[] bytes)
    {
        if (bytes == null) throw new ArgumentNullException("bytes");

        fixed (byte* bytes_ptr = bytes)
        {
            cef_post_data_element_t.set_to_bytes(_self, (UIntPtr)bytes.Length, bytes_ptr);
        }
    }

    /// <summary>
    /// Return the type of this post data element.
    /// </summary>
    public CefPostDataElementType ElementType
    {
        get { return cef_post_data_element_t.get_type(_self); }
    }

    /// <summary>
    /// Return the file name.
    /// </summary>
    public string GetFile()
    {
        var n_result = cef_post_data_element_t.get_file(_self);
        return cef_string_userfree.ToString(n_result);
    }

    /// <summary>
    /// Return the number of bytes.
    /// </summary>
    public long BytesCount
    {
        get { return (long)cef_post_data_element_t.get_bytes_count(_self); }
    }

    /// <summary>
    /// Read up to |size| bytes into |bytes| and return the number of bytes
    /// actually read.
    /// </summary>
    public byte[] GetBytes()
    {
        var size = BytesCount;
        if (size == 0) return new byte[0];

        var bytes = new byte[size];
        fixed (byte* bytes_ptr = bytes)
        {
            var written = (long)cef_post_data_element_t.get_bytes(_self, (UIntPtr)size, bytes_ptr);
            if (written != size) throw new InvalidOperationException();
        }

        return bytes;
    }
}
